package com.zpark.utils;

import com.zpark.entity.patients.Patients;

/**
 * 统一API响应结果封装类
 * @param <T> 数据类型
 */
public class ResultVO<T> {
    private int code;       // 状态码
    private String message; // 返回消息
    private T data;         // 返回数据
    private long timestamp;

    // 常用状态码常量
    public static final int SUCCESS_CODE = 200;
    public static final int BAD_REQUEST_CODE = 400;
    public static final int ERROR_CODE = 500;
    public static final int FAILED_CODE = 501; // 新增微信登录失败状态码

    // 私有构造方法
    public ResultVO(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = System.currentTimeMillis();
    }

    // 快速构建方法

    /**
     * 成功响应（带数据）
     */
    public static <T> ResultVO<T> success(T data) {
        return new ResultVO<>(SUCCESS_CODE, "操作成功", data);
    }

    /**
     * 成功响应（自定义消息）
     */
    public static <T> ResultVO<T> success(String message) {
        return new ResultVO<>(SUCCESS_CODE, message, null);
    }

    /**
     * 成功响应（带数据和自定义消息）
     */
    public static <T> ResultVO<T> success(String message, T data) {
        return new ResultVO<>(SUCCESS_CODE, message, data);
    }

    /**
     * 失败响应（默认500错误）
     */
    public static <T> ResultVO<T> fail(String message) {
        return new ResultVO<>(ERROR_CODE, message, null);
    }

    /**
     * 
     * 失败响应（自定义状态码）
     */
    public static <T> ResultVO<T> fail(int code, String message) {
        return new ResultVO<>(code, message, null);
    }

    /**
     * 失败响应（带数据）
     */
    public static <T> ResultVO<T> fail(int code, String message, T data) {
        return new ResultVO<>(code, message, data);
    }

    /**
     * 患者登录成功响应（专用方法）
     */
    public static ResultVO<Patients> loginSuccess(Patients patient) {
        return new ResultVO<>(SUCCESS_CODE, "登录成功", patient);
    }

    /**
     * 患者登录失败响应（专用方法）
     */
    public static ResultVO<Patients> loginFail(String message) {
        return new ResultVO<>(BAD_REQUEST_CODE, message, null);
    }

    // 新增微信小程序专用响应方法

    /**
     * 微信登录成功响应（带token和用户信息）
     */
    public static <T> ResultVO<T> wxLoginSuccess(T data) {
        return new ResultVO<>(SUCCESS_CODE, "微信登录成功", data);
    }

    /**
     * 微信登录失败响应（专用方法）
     */
    public static <T> ResultVO<T> wxLoginFail(String message) {
        return new ResultVO<>(FAILED_CODE, message, null);
    }

    public static ResultVO<String> error(int code, String message) {
        return new ResultVO<>(code, message, null);
    }

    // Getter 方法
    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public T getData() {
        return data;
    }

    public long getTimestamp() {
        return timestamp;
    }
}
